﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using HolidayChecker;
using HolidayChecker.Easter;

namespace HolidayCheckerTests
{
    [TestClass]
    public class HolidayCheckerTest
    {
        // Tester delle festività
        HolidaysChecker checker;

        public HolidayCheckerTest()
        {
            this.checker = new HolidaysChecker();
        }

        /// <summary>
        /// Il giorno di Pasqua è festa
        /// </summary>
        [TestMethod]
        public void EasterIsFetivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2011, 4, 24),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsTrue(condition);
            
        }

        /// <summary>
        /// Il primo settembre 2010 non è festa
        /// </summary>
        [TestMethod]
        public void SeptemberFirs2009tIsntFestivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2009, 9, 1),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsFalse(condition);
        }

        /// <summary>
        /// Il primo settembre 2013 è Domenica
        /// </summary>
        [TestMethod]
        public void SeptemberFirst2013IsFestivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2013, 9, 1),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsTrue(condition);
        }

        /// <summary>
        /// Santo Stefano è festa
        /// </summary>
        [TestMethod]
        public void SStefanoIsFestivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2009, 12, 26),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsTrue(condition);
        }

        /// <summary>
        /// Il Lunedì dell'Angelo è festivo
        /// </summary>
        [TestMethod]
        public void EasterMondayIsFestivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2011, 4, 25),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsTrue(condition);
        }

        /// <summary>
        /// Il 4 Agosto 2009 non è festa
        /// </summary>
        [TestMethod]
        public void AugustFourIsntFestivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2009, 8, 4),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsFalse(condition);
        }

        /// <summary>
        /// Il 11 Dicembre 2010 è prefestivo
        /// </summary>
        [TestMethod]
        public void DecemberElevenIsFestivity()
        {
            bool condition = this.checker.IsHoliday(
                new DateTime(2010, 12, 11),
                EasterAlgorithmEnum.OudinTondering);

            Assert.IsTrue(condition);
        }

        /// <summary>
        /// Il primo giorno feriale dopo il 15 Dicembre 2010 è
        /// il 16 Dicembre 2010
        /// </summary>
        [TestMethod]
        public void FirstWeekdayAfterDecember15()
        {
            // Valore atteso: 16/12/2010
            DateTime expected = new DateTime(2010, 12, 16);

            // Data di cui calcolare il primo giorno feriale successivo
            DateTime test = new DateTime(2010, 12, 15);

            // Valore calcolato
            DateTime actual = this.checker.GetFirstWeekDayAfterDate(test, EasterAlgorithmEnum.OudinTondering);

            Assert.AreEqual(expected, actual);

        }

        /// <summary>
        /// Il primo giorno feriale dopo il 17 Dicembre 2010 è
        /// il 20 Dicembre 2010
        /// </summary>
        [TestMethod]
        public void FirstWeekdayAfterDecember17()
        {
            // Valore atteso: 20/12/2010
            DateTime expected = new DateTime(2010, 12, 20);

            // Data di cui calcolare il primo giorno feriale successivo
            DateTime test = new DateTime(2010, 12, 17);

            // Valore calcolato
            DateTime actual = this.checker.GetFirstWeekDayAfterDate(test, EasterAlgorithmEnum.OudinTondering);

            Assert.AreEqual(expected, actual);

        }

        /// <summary>
        /// Il primo giorno feriale successivo di 3 giorni al 15 Dicembre 2010
        /// e il 20 Dicembre 2010
        /// </summary>
        [TestMethod]
        public void FirstWeekdayAfterDecember15Plus3Days()
        {
            // Valore atteso: 20/12/2010
            DateTime expected = new DateTime(2010, 12, 20);

            // Data da utilizzare per il test
            DateTime test = new DateTime(2010, 12, 15);

            // Valore calcolato
            DateTime actual = this.checker.GetFirstWeekDayAfterDate(test, 3, EasterAlgorithmEnum.OudinTondering);

            Assert.AreEqual(expected, actual);

        }

        /// <summary>
        /// Il primo giorno feriale successivo di 10 giorni al 15 Dicembre 2010
        /// e il 27 Dicembre 2010
        /// </summary>
        [TestMethod]
        public void FirstWeekdayAfterDecember15Plus15Days()
        {
            // Valore atteso: 16/12/2010
            DateTime expected = new DateTime(2010, 12, 27);

            // Data di cui calcolare il primo giorno feriale successivo
            DateTime test = new DateTime(2010, 12, 15);

            // Valore calcolato
            DateTime actual = this.checker.GetFirstWeekDayAfterDate(test, 10, EasterAlgorithmEnum.OudinTondering);

            Assert.AreEqual(expected, actual);

        }

    }

}
